走进Linux_shell script 入门

引:要想管理好自己的主机,自动化管理系统的好工具——shell script,这个家伙是真的需要好好学习学习的!

什么是shell script

shell script 是利用shell的功能所写的一个“程序”,这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面,搭配正则表达式,管道命令与数据重定向等功能,以达到我们所想要的处理目的。

为什么要学习shell script

  1. 自动化管理的重要依据
  2. 追踪与管理系统的重要工作
  3. 简单入侵检测功能
  4. 连续命令单一化
  5. 简易的数据处理
  6. 跨平台与学习历程较短

shell script编写的注意事项

  1. 命令的执行是从上而下,从左往右地分析与执行;
  2. 命令、参数间的多个空白都会被忽视掉;
  3. 空白行也将被忽略掉,并且tab按键所得的空白同样视为空格键;
  4. 如果读到一个enter符号(CR),就尝试开始结束该行(或该串)命令
  5. 至于如果一行的内容太多,则可以使用“\enter”来扩展至下一行;
  6. “#”可作为批注,任何加在#后面的数据将全部被视为批注文件而被忽略。

shell script的执行

假设你的程序文件名是/home/rex/shell.sh

  1. 直接执行命令:shell.sh文件必须具备可读可执行(rx)的权限,然后:
    • 绝对路径:使用/home/rex/shell.sh
    • 相对路径:假设工作目录在/home/rex/,则使用./shell.sh来执行
    • 变量“PATH”功能:将shell.sh放在PATH指定的目录内,例如:~/bin/。
  2. 以bash进程来执行:通过“bash shell.sh”或“sh shell.sh”来执行
  3. 利用source来执行:这样这个脚本将在父进程中执行,各项操作都会在原本的bash内生效。如果直接执行,script是在子进程中的bash内执行的,当子进程完成后,子进程的各项变量或操作将会结束而不会传回到父进程中。

良好的 script 撰写习惯

在每个 script 的档头处记录好:

  1. script 的功能;
  2. script 的版本资讯;
  3. script 的作者与联络方式;
  4. script 的版权宣告方式;
  5. script 的 History (历史纪录);
    6。script 内较特殊的命令,使用绝对路径的方式来下达;
  6. script 运行时需要的环境变量预先宣告与配置。

Hello Word程序

1
2
3
4
5
6
7
8
9
#!/bin/bash // 声明这个script使用的shell名称
# Program:
# This program shows "Hello World!" in your screen.
# History:
# 2015/11/03 Jiange First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e "Hello World! \a \n"
exit 0

善用判断式

利用test命令的测试功能

如下面的例子,用于检测文件夹是否存在:

1
test -e /dmtsai && echo "exist" || echo "Not exist"

利用判断符号[]

如果我想要知道 $HOME 这个变量是否为空的,可以这样做:

1
[ -z "$HOME" ] ; echo $?

对于判断符号我们一定要注意:

  1. 在中括号 [] 内的每个组件都需要有空白键来分隔;
  2. 在中括号内的变量,最好都以双引号括号起来;
  3. 在中括号内的常数,最好都以单或双引号括号起来。

shell script 的默认变量($0, $1…)

运行的脚本档名为 $0 变量,第一个接的参数就是 $1,依次类推。其他特殊变量:

  1. $# :代表后接的参数个数;
  2. $@ :代表”$1” “$2” “$3” “$4” …之意,每个变量是独立的(用双引号括起来);
  3. $* :代表『”$1c$2c$3c$4…” ,其中 c 为分隔字节,默认为空白键。

条件判断式

利用 if …. then

如下面的代码:

1
2
3
4
5
6
7
if [ "$1" == "hello" ]; then
echo "Hello, how are you ?"
elif [ "$1" == "" ]; then
echo "You MUST input parameters, ex> {$0 someword}"
else
echo "The only parameter is 'hello', ex> {$0 hello}"
fi

利用 case ….. esac 判断

如下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
case $1 in                             
"one")
echo "Your choice is ONE"
;;
"two")
echo "Your choice is TWO"
;;
"three")
echo "Your choice is THREE"
;;
*)
echo "Usage $0 {one|two|three}"
;;
esac

利用 function 功能

如下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function printit(){
echo "Your choice is $1" # 这个 $1 必须要参考底下命令的下达
}

echo "This program will print your selection !"
case $1 in
"one")
printit 1 # 请注意, printit 命令后面还有接参数!
;;
"two")
printit 2
;;
"three")
printit 3
;;
*)
echo "Usage $0 {one|two|three}"
;;
esac

循环(loop)

while do done, until do done (不定次数循环)

如下面的代码:

1
2
3
4
5
6
7
8
9
while [ condition ]  <==中括号内的状态就是判断式
do <==do 是循环的开始!
程序段落
done <==done 是循环的结束

until [ condition ]
do
程序段落
done

for…do…done (固定次数循环)

如下面的代码:

1
2
3
4
for var in con1 con2 con3 ...
do
程序段
done

for…do…done 的数值处理

如下面的代码:

1
2
3
4
5
6
7
8
read -p "Please input a number, I will count for 1+2+...+your_input: " nu

s=0
for (( i=1; i<=$nu; i=i+1 ))
do
s=$(($s+$i))
done
echo "The result of '1+2+3+...+$nu' is ==> $s"

shell script 的追踪与调试

可以使用下面的命令:

1
2
3
4
5
6
sh [-nvx] scripts.sh

选项与参数:
-n :不要运行 script,仅查询语法的问题;
-v :在运行 sccript 前,先将 scripts 的内容输出到屏幕上;
-x :将使用到的 script 内容显示到萤幕上,这是很有用的参数!

参考

  1. 《鸟哥的Linux私房菜》